package cn.ant.mqHandle.consumer;

import cn.ant.config.RabbitMQConfig;
import cn.ant.entity.MessageSendDTO;
import com.alibaba.fastjson2.JSONObject;
import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.support.AmqpHeaders;
import org.springframework.messaging.handler.annotation.Header;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.stereotype.Component;

import java.io.IOException;

/**
 * 正常的消费者，监听并处理队列”MsgHandleQueue“的消息，失败时会交由死信交换机
 *
 * @author Anhui AntLaddie <a href="https://juejin.cn/user/4092805620185316">(掘金蚂蚁小哥)</a>
 * @version 1.0
 **/
@Slf4j
@Component
public class QueueMsgConsumer {

    /***
     * 监听并处理队列”MsgHandleQueue“的消息
     * @param msgData 具体的消息
     * @param deliveryTag 处理消息的编号
     * @param routingKey 当前的路由key
     * @param message message对象
     * @param channel 信道对象
     */
    @RabbitListener(queues = {RabbitMQConfig.QUEUE_NAME}, ackMode = "MANUAL")
    public void testConsumerA(@Payload String msgData, // 这个是生产者发送的JSON消息
                              @Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag, // 处理消息的编号
                              @Header(AmqpHeaders.RECEIVED_ROUTING_KEY) String routingKey,
                              Message message,
                              Channel channel) throws IOException {
        // 把接收JSON的数据转换为对象
        MessageSendDTO messageSendDTO = JSONObject.parseObject(msgData, MessageSendDTO.class);
        // 模拟判断我是否需要手动确认(若随机不是2则确认消费，否则拒绝，交由死信队列)
        if (Math.ceil(Math.random() * 2) != 2) {
            log.info("处理完成接收到的队列信息为：{}，从{}路由过来的数据", messageSendDTO, routingKey);
            // 手动确认
            channel.basicAck(deliveryTag, false);
        } else {
            log.info("未处理完成接收到的队列信息为：{}，从{}路由过来的数据", messageSendDTO, routingKey);
            channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, false);
        }
    }
}
